﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;


namespace PMS
{
    public partial class BackupAndRestore : DevExpress.XtraEditors.XtraForm
    {
        private static Server srvSql;
        
        public BackupAndRestore()
        {
            InitializeComponent();
        }

        private void frmBackup_Load(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            // Create a DataTable where we enumerate the available servers
            DataTable dtServers = SmoApplication.EnumAvailableSqlServers(true);
            // If there are any servers at all
            if (dtServers.Rows.Count > 0)
            {
                // Loop through each server in the DataTable
                foreach (DataRow drServer in dtServers.Rows)
                {
                    // Add the name to the combobox
                    cmbServer.Items.Add(drServer["Name"]);
                }
            }
        }

        private void btnConnect_Click(object sender, EventArgs e)
        {
            try
            {
                if (cmbServer.SelectedItem != null && cmbServer.SelectedItem.ToString() != "")
                {
                    ServerConnection srvConn = new ServerConnection(cmbServer.SelectedItem.ToString());
                    srvConn.LoginSecure = false;
                    srvConn.Login = txtUsername.Text;
                    srvConn.Password = txtPassword.Text;
                    srvSql = new Server(srvConn);
                    
                    foreach (Database dbServer in srvSql.Databases)
                    {
                        cmbDatabase.Items.Add(dbServer.Name);
                    }
                    btnBackup.Enabled = true;
                    btnRestore.Enabled = true;
                }
                else
                {
                    MessageBox.Show("Vui lòng chọn máy chủ cơ sở dữ liệu", "Máy chủ chưa chọn", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, "Không thể kết nối đến máy chủ cơ sở dữ liệu. \nSai tên đăng nhập hoặc mật khẩu!", "Lỗi kết nối", MessageBoxButtons.OK);
            }
        }

        private void btnBackup_Click(object sender, EventArgs e)
        {
            string n = string.Format("NP-{0:yyyyMMdd-hhmmss}.bak", DateTime.Now);
            saveBackupDialog.FileName = n;
            
            try
            {
                if (srvSql != null)
                {
                    if (saveBackupDialog.ShowDialog() == DialogResult.OK)
                    {
                        this.Cursor = Cursors.WaitCursor;
                        Backup bkpDatabase = new Backup();
                        bkpDatabase.Action = BackupActionType.Database;
                        bkpDatabase.Database = cmbDatabase.SelectedItem.ToString();

                        BackupDeviceItem bkpDevice = new BackupDeviceItem(saveBackupDialog.FileName, DeviceType.File);
                        bkpDatabase.Devices.Add(bkpDevice);
                        //Progress bar
                        this.progressBar1.Visible = true;
                        this.progressBar1.Value = 0;
                        this.progressBar1.Maximum = 100;
                        this.progressBar1.Value = 10;

                        bkpDatabase.PercentCompleteNotification = 10;
                        bkpDatabase.PercentComplete += new PercentCompleteEventHandler(ProgressEventHandler);

                        // Perform the backup
                        bkpDatabase.SqlBackup(srvSql);

                        MessageBox.Show("Sao lưu cơ sở dữ liệu " + cmbDatabase.SelectedItem.ToString() + " thành công", "Sao lưu", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                else
                {
                    MessageBox.Show("Không thể kết nối đến cơ sở dữ liệu " + cmbDatabase.SelectedItem.ToString(), "Lỗi kết nối", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                this.Cursor = Cursors.Default;
                this.progressBar1.Value = 0;
                this.progressBar1.Visible = false;
            }
        }

        public void ProgressEventHandler(object sender, PercentCompleteEventArgs e)
        {
            this.progressBar1.Value = e.Percent;
        }

        private void btnRestore_Click(object sender, EventArgs e)
        {
            try
            {
                if (srvSql != null)
                {
                    if (openBackupDialog.ShowDialog() == DialogResult.OK)
                    {
                        this.Cursor = Cursors.WaitCursor;
                        Restore rstDatabase = new Restore();
                        rstDatabase.Action = RestoreActionType.Database;
                        rstDatabase.Database = cmbDatabase.SelectedItem.ToString();

                        BackupDeviceItem bkpDevice = new BackupDeviceItem(openBackupDialog.FileName, DeviceType.File);
                        rstDatabase.Devices.Add(bkpDevice);
                        rstDatabase.ReplaceDatabase = true;
                        //Progress bar
                        this.progressBar1.Visible = true;
                        this.progressBar1.Value = 0;
                        this.progressBar1.Maximum = 100;
                        this.progressBar1.Value = 10;

                        rstDatabase.PercentCompleteNotification = 10;
                        rstDatabase.PercentComplete += new PercentCompleteEventHandler(ProgressEventHandler);

                        // Perform the restore
                        rstDatabase.SqlRestore(srvSql);

                        MessageBox.Show("Phục hồi cơ sở dữ liệu " + cmbDatabase.SelectedItem.ToString() + " thành công", "Phục hồi", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                else
                {
                    // There was no connection established; probably the Connect button was not clicked
                    MessageBox.Show("Không thể kết nối đến cơ sở dữ liệu " + cmbDatabase.SelectedItem.ToString(), "Lỗi kết nối", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                this.Cursor = Cursors.Default;
                this.progressBar1.Value = 0;
                this.progressBar1.Visible = false;
            }
        }

        private void BackupAndRestore_Activated(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.Default;
        }
    }
}